#!/bin/bash

#################执行说明########################

# 分配执行权限: chmod u+x ./startup.sh
# 接受两个参数: 参数1:jar包目录(默认:startup.sh所在目录) 参数2:profiles.active(默认:pro)

#### 功能
# 1. 可后台启动指定 jar路径下的 所有 jar包 (参数1:jar包所在目录, 默认:startup.sh所在目录)
# 2. 可后台启动当个 jar包 (参数1: 具体jar包路径, /**/***/**.jar)
# 3. 可指定启动具体的profiles.active配置(参数2), 默认:pro
# 4. 启动前kill掉旧进程 并 移动旧日志文件 到  jar包同级目录logs文件夹里
# 5. 启动后保存日志 到 jar包同级目录下日志文件 并 在控制台输出

#################自定义函数######################

### 获取执行文件所在目录
GetShDir(){
  if [ -L $1 ]
  then
    echo `dirname $(readlink $1)`
  else
    echo `dirname $1`
  fi
}

### 获取 jar包 所在目录
GetJarDir(){
  if [ $2 ]
  then
    JARDIR=$2
    if [ "${JARDIR: -1}" = "/" ]
    then
         JARDIR=${1%?}
    fi
  else
      JARDIR=$(cd $1; pwd)
  fi
  echo $JARDIR"/"
}

### 获取 profiles.active 配置
GetActive(){
  ACTIVE="pro"
  if [ $1 ]
  then
    ACTIVE=$1
  fi
  echo $ACTIVE
}

### jar后台运行进程并输出日志
NohupJava(){
  nohup java -jar $1 --spring.profiles.active=$2 >$3 2>&1 & tail -f $3
}

### 启动
DoStartUp(){
    # 定义变量
    JARPATH=$1$2
    JARNAME=${2%.*}
    LOGNAME=$JARNAME"_`date +%m%d%H%M`.log"

    echo "###################开始运行JAR包: $JARPATH"
    echo "###################输出日志到: $1$LOGNAME"

    # 获取相关进程数
    COUNT=`ps -ef | grep "java -jar $JARPATH" | grep -v grep | wc -l`

    echo "###################当前相关进程数: $COUNT"

    if [ $COUNT -eq 0 ];then

      # 后台运行进程并输出日志
      NohupJava $JARPATH $3 $1$LOGNAME

    else

      # 移动历史日志到子目录logs下
      if [ ! -d "$1"/logs ]; then
        mkdir "$1"/logs
      fi
      LOGNUM=`find $1 -maxdepth 1 -name "*.log" -type f|wc -l`
      if [ $LOGNUM -gt 0 ]; then
        mv "$1"*.log "$1"/logs
        sleep 3
      fi

      # kill相关进程
      ps -ef | grep "java -jar $JARPATH" | grep -v grep | awk '{print $2}' | xargs kill -9

      # 后台运行进程并输出日志
      NohupJava $JARPATH $3 $1$LOGNAME
    fi
}


#################执行函数######################

# 定义变量
ACTIVE=`GetActive $2`

if [ $1 ] && [ "${1##*.}" = "jar" ]; then

  ## 判断jar包是否存在
  if [ ! -e "$1" ]; then
    echo "Error: $1 文件不存在"
    exit
  fi

  # 定义变量
  JARDIR=${1%/*}"/"
  JARNAME=${1##*/}

  ## 启动
  DoStartUp $JARDIR ${JARNAME} $ACTIVE

else

  # 定义变量
  SHDIR=`GetShDir $0`
  JARDIR=`GetJarDir $SHDIR $1`

  ## 判断目录下是否有jar包
  JARNUM=`find $JARDIR -maxdepth 1 -name "*.jar" -type f|wc -l`
  if [ $JARNUM -eq 0 ]; then
    echo "Error: $JARDIR 目录下没有 jar 包文件"
    exit
  fi

  ## 遍历 jar包 所在目录
  FILES=`ls $JARDIR`
  for FILE in $FILES
  do
    if [ "${FILE##*.}" = "jar" ]; then

      ## 启动
      DoStartUp $JARDIR ${FILE} $ACTIVE

    fi
  done

fi

